#include "HeadDragon.h"
#include "Resource.h"


HeadDragon::HeadDragon(LPDIRECT3DDEVICE9 d3ddv,  LPDIRECT3DSURFACE9 BackBuffer, LPD3DXSPRITE SpriteHandler, float x, float y, int ID, int Object_State, int Direction): Object(x, y)//, ID, Object_State)
{
	this->d3ddv = d3ddv;
	this->BackBuffer = BackBuffer;
	this->SpriteHandler = SpriteHandler;

	this->setIDObjType(ID);

	this->blood = 3;

	pos_x = x;
	pos_y = y;
	 
	veloc_x = 0;
	veloc_y = 0;
	accel_y = 0;

	p_sprite = new Sprite(SpriteHandler, ResourceMng::GetInst(d3ddv, BackBuffer)->GetTexture(ResourceMng::GetInst(d3ddv, BackBuffer)->getMapTexture()[58]->getFileName()), 125, 0);
	p_light = new Sprite(SpriteHandler, ResourceMng::GetInst(d3ddv, BackBuffer)->GetTexture(ResourceMng::GetInst(d3ddv, BackBuffer)->getMapTexture()[7]->getFileName()), 125, 0);

	width = p_sprite->getTexture()->getWidth();
	height = p_sprite->getTexture()->getHeight();

	timeDie = 0;

	this->obj_state = Object_State;//ES_ACTIVING;
	direction = Direction;
	if (this->obj_state != ES_REMOVE)
	{
		changeState(ES_ACTIVING);
	}
	

	weapon = NULL;
}

HeadDragon::~HeadDragon()
{
	/*if (_sprite != NULL)
	delete _sprite;*/
	
}

 

void HeadDragon::render(int cameraX, int cameraY)
{
	
	if (obj_state != ES_REMOVE && obj_state != ES_NORMAL)
	{
		p_sprite->render(pos_x, pos_y, cameraX, cameraY);
	}
	if (weapon != NULL)
	{
		weapon->render(cameraX, cameraY);
	}
	
}

OBJECT_TYPE HeadDragon::getObjectType()
{
	return OBJECT_ENEMY;
}

/**--------------------------------------------------------
*Description : Turn left Turtle
*Method name : TurnLeft
*Parameters :   
*Return value : void
--------------------------------------------------------**/
void HeadDragon :: turnLeft()
{
	is_turn_left = true;
	p_sprite->setFrame(0, 1);
	p_sprite->setIndex(0);
}


/**--------------------------------------------------------
*Description : Turn right Turtle
*Method name : TurnRight
*Parameters :   
*Return value : void
--------------------------------------------------------**/
void HeadDragon :: turnRight()
{
	is_turn_left = false;
	p_sprite->setFrame(1, 2);
	p_sprite->setIndex(1);
}

void HeadDragon::update(list<Object*>* obj_list, DxInput* input, float gameTime)
{
	//switch (obj_state)
	//{
	//case ES_ACTIVING:
	//	move(obj_list, gameTime);//Move(staObjs, gameTime);
	//	
	//	if (pos_y <= 0)	//goomba roi xuong ho, height = 0
	//	{
	//		changeState(ES_REMOVE);
	//	}
	//	break;

	//case ES_DIED:
	//	timeDie += gameTime;
	//	if (timeDie > 900)
	//	{
	//		changeState(ES_REMOVE);
	//	}
	//	break;

	//case ES_FALL:
	//	pos_x += veloc_x * gameTime;
	//	veloc_y -= accel_y * gameTime;
	//	pos_y += veloc_y * gameTime + 1/2 * accel_y * gameTime *gameTime;
	//	if (pos_y <= 0)	//goomba roi xuong ho, height = 0
	//	{
	//		changeState(ES_REMOVE);
	//	}
	//	
	//	break;
	//}
	//
	//p_sprite->update(gameTime);
	
}

void HeadDragon::update(list<Object*>* obj_list, DxInput* input, float gameTime, Object* simon)
{
	switch (obj_state)
	{
	case ES_NORMAL:
		break;

	case ES_ACTIVING:
		count_time += gameTime;
		if (count_time > 1000)
		{
			changeState(ES_FIGHT);
		}
		if (simon->getPosX() < this->pos_x)
		{
			turnLeft();
		}
		else
			turnRight();

		if (weapon != NULL)
		{
			weapon->update(obj_list, input, gameTime, simon);
		}
		break;

	case ES_FIGHT:
		count_time += gameTime;
		if (count_time > 3000)
		{
			changeState(ES_ACTIVING);
		}
		if (weapon != NULL)
		{
			weapon->update(obj_list, input, gameTime, simon);
		}
		break;

	case ES_DIED:
		timeDie += gameTime;
		if (timeDie > 900)
		{
			changeState(ES_REMOVE);
		}
		break;

	default:
		break;
	}

	p_sprite->update(gameTime);

}

void HeadDragon::move(list<Object*>* obj_list, float TPF)
{
	//Object* obj;
	//list<Object*>::iterator i;
	//width = p_sprite->getTexture()->getWidth();
	//height = p_sprite->getTexture()->getHeight();
	//
	//pos_x_old = pos_x;
	//pos_y_old = pos_y;

	//pos_x_old = pos_x;
	//pos_y_old = pos_y;
	//

	////Xet va cham theo truc X
	//pos_x += veloc_x * TPF;
	//
	//

	////Xet va cham theo truc Y
	//if (is_gravity == false)
	//{
	//	accel_y = 0;
	//}
	//else
	//{
	//	accel_y = RED_DRAGON_GRAVITY;
	//}	
	//veloc_y -= accel_y * TPF;
	//pos_y += veloc_y * TPF + 1/2.0 * accel_y * TPF * TPF;
	////ResetRect();


	////kiem tra va cham nam tren gach, da
	//for (i = obj_list->begin(); i != obj_list->end(); i++)
	//{
	//	obj = *i;
	//	if (obj->getObjectType() == OBJECT_LAND)
	//	{
	//		//Box box = this->getBox(time);
	//		Box box(this->pos_x_old,
	//			this->pos_y_old - this->height, 
	//			width, 
	//			height, 
	//			veloc_x * TPF, 
	//			veloc_y * TPF + 1.0f/2.0f * accel_y * TPF * TPF);

	//		//Box block = obj->getBox(time);
	//		Box block(obj->getPosX(),
	//			obj->getPosY() - obj->getHeight(),// - 0.11,
	//			obj->getWidth(),
	//			obj->getHeight()
	//			);

	//		Box boxphase = Collision::GetSweptBroadphaseBox(box);
	//		if (Collision::AABBCheck(boxphase, block))
	//		{
	//			float normalx = 0;
	//			float normaly = 0;
	//			float collision_time = Collision::SweptAABB(box, block, normalx, normaly);
	//			if (0 < collision_time && collision_time < 1)
	//			{
	//				is_gravity = false;
	//				if (normalx == 1 && normaly == 0)		//va cham tu phai -> trai
	//				{
	//					//pos_x = _xOld + veloc_x * collision_time;// + 1.0f/2.0f * accel_x * collision_time *collision_time;
	//					//accel_x = 0;
	//					//veloc_x = -veloc_x;

	//					if (this->pos_y_old - this->height < obj->getPosY())
	//					{
	//						pos_x = pos_x_old + veloc_x * collision_time;
	//						veloc_x = -veloc_x;						
	//					}
	//				} 
	//				else if (normalx == -1 && normaly == 0)		//va cham tu trai -> phai
	//				{
	//					//pos_x = _xOld + veloc_x * collision_time;// + 1.0f/2.0f * accel_x * collision_time *collision_time;
	//					//accel_x = 0;
	//					//veloc_x = -veloc_x;

	//					if (this->pos_y_old - this->height < obj->getPosY())
	//					{
	//						pos_x = pos_x_old + veloc_x * collision_time;
	//						veloc_x = -veloc_x;						
	//					}
	//				}
	//				else if (normalx == 0 && normaly == -1)		//va cham tu duoi -> tren
	//				{
	//					
	//				}
	//				else if (normalx == 0 && normaly == 1)		//va cham tu tren -> duoi
	//				{
	//					

	//					pos_y = pos_y_old + veloc_y * collision_time + 1.0f/2.0f * accel_y * collision_time *collision_time;// + 0.5;
	//					accel_y = 0;
	//					veloc_y = 0;

	//					
	//				}

	//				/*if (this->_yOld - this->height <= obj->getPosY() + 1.5)
	//				{
	//					isGravity = false;
	//				}
	//				else
	//				{
	//					isGravity = true;
	//				}*/
	//				 

	//				

	//				 
	//			}
	//			else
	//			{
	//				
	//				is_gravity = true;
	//			}
	//		}
	//		else
	//		{
	//			is_gravity = true;
	//			
	//		}


	//		 
	//	}
	//	else
	//	{
	//		is_gravity = true;
	//	}
	//}

	//if(veloc_x > 0)
	//{
	//	turnRight();
	//}
	//else
	//{
	//	turnLeft();
	//}

	//pos_x_old = pos_x;
	//pos_y_old = pos_y;
	//pos_x_old = pos_x;
	//pos_y_old = pos_y;
	//	

	//if (veloc_x >= 0)
	//{
	//	direction = 2;
	//} 
	//else
	//{
	//	direction = 1;
	//}
}

void HeadDragon::move(list<Object*>* obj_list, float TPF, Object* simon)
{
	//Object* obj;
	//list<Object*>::iterator i;
	//width = p_sprite->getTexture()->getWidth();
	//height = p_sprite->getTexture()->getHeight();
	//
	//pos_x_old = pos_x;
	//pos_y_old = pos_y;

	//

	////Xet va cham theo truc X
	//pos_x += veloc_x * TPF;
	//
	//

	////Xet va cham theo truc Y
	//if (is_gravity == false)
	//{
	//	accel_y = 0;
	//}
	//else
	//{
	//	accel_y = HEAD_DRAGON_GRAVITY;
	//}	
	//veloc_y -= accel_y * TPF;
	//pos_y += veloc_y * TPF + 1/2.0 * accel_y * TPF * TPF;
	//


	////kiem tra va cham nam tren gach, da
	//for (i = obj_list->begin(); i != obj_list->end(); i++)
	//{
	//	obj = *i;
	//	if (obj->getObjectType() == OBJECT_LAND)
	//	{
	//		
	//		Box box(this->pos_x_old,
	//			this->pos_y_old - this->height, 
	//			width, 
	//			height, 
	//			veloc_x * TPF, 
	//			veloc_y * TPF + 1.0f/2.0f * accel_y * TPF * TPF);
	//		
	//		Box block(obj->getPosX(),
	//			obj->getPosY() - obj->getHeight(),
	//			obj->getWidth(),
	//			obj->getHeight());

	//		Box boxphase = Collision::GetSweptBroadphaseBox(box);
	//		if (Collision::AABBCheck(boxphase, block))
	//		{
	//			float normalx = 0;
	//			float normaly = 0;
	//			float collision_time = Collision::SweptAABB(box, block, normalx, normaly);
	//			if (0 < collision_time && collision_time < 1)
	//			{
	//				is_gravity = false;
	//				if (normalx == 1 && normaly == 0)		//va cham tu phai -> trai
	//				{
	//					/*if (this->pos_y_old - this->height < obj->getPosY())
	//					{
	//						pos_x = pos_x_old + veloc_x * collision_time;
	//						turnRight();
	//					}*/
	//				} 
	//				else if (normalx == -1 && normaly == 0)		//va cham tu trai -> phai
	//				{
	//					/*if (this->pos_y_old - this->height < obj->getPosY())
	//					{
	//						pos_x = pos_x_old + veloc_x * collision_time;
	//						turnLeft();
	//					}*/
	//				}
	//				else if (normalx == 0 && normaly == -1)		//va cham tu duoi -> tren
	//				{
	//					
	//				}
	//				else if (normalx == 0 && normaly == 1)		//va cham tu tren -> duoi
	//				{
	//					pos_y = pos_y_old + veloc_y * collision_time + 1.0f/2.0f * accel_y * collision_time *collision_time;
	//					accel_y = 0;
	//					veloc_y = 0;
	//				}//end if
	//				 
	//			}
	//			else
	//			{
	//				is_gravity = true;
	//			}//end if
	//		}
	//		else
	//		{
	//			is_gravity = true;
	//		}//end if			 
	//	}
	//	else
	//	{
	//		is_gravity = true;
	//	}//end if
	//}//end for



	 

	/*if(veloc_x > 0)
	{
		turnRight();
	}
	else
	{
		turnLeft();
	}*/

	/*pos_x_old = pos_x;
	pos_y_old = pos_y;*/

	/*if (pos_x - HEAD_DRAGON_DISTANCE_X >= center_pos_x)
	{
		turnLeft();
	}
	else if (pos_x + HEAD_DRAGON_DISTANCE_X <= center_pos_x)
	{
		turnRight();
	}*/

	//if (veloc_x >= 0)
	//{
	//	direction = 2;
	//} 
	//else
	//{
	//	direction = 1;
	//}
}

void HeadDragon::changeState(int state)
{
	obj_state = state;
	switch (obj_state)
	{
	case ES_ACTIVING:
		count_time = 0;
		break;

	case ES_FIGHT:
		count_time = 0;
		if (is_turn_left == true)
		{
			p_sprite->setFrame(0,1);
			p_sprite->setIndex(0);
			weapon = new RedDragonWeapon(d3ddv, BackBuffer, SpriteHandler, pos_x, pos_y - 5, true);
		}
		else
		{
			p_sprite->setFrame(1,2);
			p_sprite->setIndex(1);
			weapon = new RedDragonWeapon(d3ddv, BackBuffer, SpriteHandler, pos_x, pos_y - 5, false);
		}
		break;

	case ES_DIED:
		blood--;
		if (blood == 0)
		{
			p_sprite = p_light;
			veloc_x = 0;
		}
		else
		{
			changeState(ES_ACTIVING);
		}
		break;
	}
}
